//var let const

// console.log(nVar); //!undefine by var  声明提升，在运行时js收集var变量到作用域顶层

var nVar = 0;

// console.log(nLet); //!error 报错 let 声明的对象不会发生声明提升 同时不支持变量覆盖
//? let nLet = 0;

var num = 1;

var num = 2;

// console.log(num); //!2 在变量提升后，后声明的变量会覆盖同名变量

const fn = () => {
  //var 不存在 块级作用域
  for (var i = 0; i < 3; i++) {
    console.log(i); //0 , 1, 2
  }
  console.log(i); // 3
};

fn();

const AA = 10; //! const 声明的变量声明后必须赋值，声明后的变量不予许修改其指向的栈

const OBJ = { a: 1 };

OBJ.a = 2; //! 允许修改，因为栈地址没有改变，修改的是引用地址内的值
